Software developers often wish to add some piece of functionality to their software without modifying the core parts of the code itself. There are various reasons for this. For example, it may not be prudent to change the code due to schedule pressures or fragility concerns. Also, the functionality may not be core to the software, and thus makes more sense to be structured as an add-on. Furthermore, the functionality itself may only be needed for a very limited period of time, such as while diagnosing a particular problem.
Profilers targeting runtime environments try keep their overhead as low as possible. The developers of profilers may insert diagnostic code, such as assertions or logging statements in debug builds. However, they do not want to pay even the small speed cost of checking whether such functionality is desired or the larger size cost of keeping the dormant code around. Therefore, developers of profilers will typically remove the diagnostic code from retail builds. There is no easy way to insert functionality for debugging and other purposes without modifying the code itself.